package com.yeyks.commonReference.service.consumer;

import com.yeyks.consumer.dal.domain.UserCouponInfo;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yeyks.consumer.dal.domain.UserInfo;
import com.yeyks.consumer.dto.BigGiftCouponListDTO;
import com.yeyks.consumer.dto.UserCouponInfoDTO;
import com.yeyks.consumer.dto.UserCouponPushDTO;
import com.yeyks.consumer.param.UserCouponInfoSelectUserCouponListParam;
import com.yeyks.consumer.param.coupon.UserCouponPushParam;
import com.yeyks.other.dal.domain.CouponInfo;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Map;


/**
 * <p>
 * 领取券表 服务类
 * </p>
 *
 * @author yun
 * @since 2019-06-25
 */
public interface UserCouponInfoService extends IService<UserCouponInfo> {
    /**
     * 根据一定条件查询当前用户的优惠券
     *
     * @param id
     * @param useStatus 是否已经使用, 默认1未使用，2已使用，3已过期
     * @param price 满减价格
     * @param pageNum
     * @param pageSize
     * @return
     */
//    Map<String, Object> selectUserCouponList(Integer id, Integer useStatus, Integer price, Integer pageNum, Integer pageSize);

    /**
     * 给用户发放两张新人红包券
     *
     * @param id
     */
    @Transactional
    Boolean createNewCoupon(Integer id);

    /**
     * 修改券的使用状态
     * @param couponId
     * @param useStatus 是否已使用，0未使用，1已使用, 2已锁定，-1待到账,-2删除
     * @return
     */
    Integer updateUsed(Integer couponId, Integer useStatus);

    /**
     * 通过userCouponId修改优惠券的使用状态
     *
     * @param userCouponId
     * @param use
     * @return
     */
    Integer updateCouponUseById(Integer userCouponId, String orderNO, Boolean use);

    /**
     * 通过券id和用户id查询该用户未使用的券
     *
     * @param couponId
     * @param id
     * @return
     */
    UserCouponInfo selectUserCoupon(Integer couponId, Integer id);

    /**
     * 通过主键id查询用户券对象
     *
     * @param id
     * @return
     */
    UserCouponInfo selectUserCouponById(Integer id);

    /**
     * 通过count，减少券的剩余数，并增加券的领取数
     *
     * @param count 领取的数量
     * @param couponInfo
     * @return
     */
    Integer updateCount(Integer count, CouponInfo couponInfo);


    /**
     * 根据一定条件查询当前用户的优惠券(V2)
     *
     * @param id
     * @param useStatus 是否已经使用, 默认1未使用，2已使用，3已过期
     * @param price     满减价格
     * @param pageNum
     * @param pageSize
     * @return
     */
    Map<String, Object> selectUserCouponList(UserCouponInfoSelectUserCouponListParam param);

//    /**
//     * 修改券为已经使用条件
//     * @param couponId
//     * @return
//     */
//    Integer updateUsed(Integer couponId);

    /**
     * 通过userCouponId修改优惠券的使用状态
     *
     * @param userCouponId
     * @param use
     * @return
     */
    Integer updateCouponUseById(Integer userCouponId, Integer use);

//    /**
//     * 通过券id和用户id查询该用户未使用的券
//     *
//     * @param couponId
//     * @param id
//     * @return
//     */
//    UserCouponInfo selectUserCoupon(Integer couponId, Integer id);

//    /**
//     * 用户领取券
//     *
//     * @param userId
//     * @param couponId
//     * @return
//     */
//    Boolean userGetCoupon(Integer userId, Integer couponId);

    /**
     * 用戶領取推广券
     *
     * @param userId
     * @param couponValue
     * @param orderNo
     * @return
     */
    Boolean getRecommendCoupon(Integer userId, Integer couponValue, String orderNo);

    /**
     * 用户领取鱼宝兑换券
     *
     * @param userId
     * @param couponId
     * @return
     */
    Boolean userGetFishBallCoupon(Integer userId, Integer couponId);

    /**
     * 获取推广充值获取的优惠券
     *
     * @param userInfo
     * @return
     */
    UserCouponInfoDTO selectNewCoupon(UserInfo userInfo);

    /**
     * 通过主键修改用户领取券
     *
     * @param userCouponInfo
     */
    Integer updateByKey(UserCouponInfo userCouponInfo);

    /**
     * 查询券是否可用
     *
     * @param id
     */
    void checkCouponById(Integer id);

    /**
     * 给用户发大礼包优惠券(满300减30券2张、满200减20券4张、满100减10券6张)
     *
     * @param userId
     * @param orderNo
     */
    void giveBagGift(Integer userId, String orderNo);

    /**
     * 推广大礼包查询
     *
     * @param userId
     * @param orderNo
     * @return
     */
    List<BigGiftCouponListDTO> bagGiftCouponList(Integer userId, String orderNo);

    /**
     * 确定发放大礼包券
     *
     * @param orderNo
     */
    @Transactional(rollbackFor = Exception.class)
    void giveSmallBlackFishSpreeSuccess(String orderNo);

    /**
     * 充值发放大礼包券失败
     *
     * @param orderNo
     */
    @Transactional(rollbackFor = Exception.class)
    void giveSmallBlackFishSpreeFail(String orderNo);

    /**
     * 查询推送的优惠券
     * @return
     */
    UserCouponPushDTO selectCouponPush(UserCouponPushParam param);

    /**
     * 优惠券使用次数
     *
     * @param userId
     * @return
     */
    Integer selectCouponUseCountByUserId(Integer userId);

    //领券,无通知
    void giveTypeCoupon(Integer userId, Integer type);
}
